package com.example.MyRESTAssured.restAsurred;

import io.restassured.RestAssured;
import io.restassured.parsing.Parser;
import io.restassured.response.Response;
import org.junit.Test;

import javax.xml.namespace.NamespaceContext;

import java.util.Iterator;
import java.util.List;

import static io.restassured.RestAssured.*;
import static io.restassured.config.XmlConfig.xmlConfig;
import static io.restassured.matcher.RestAssuredMatchers.matchesDtd;
import static io.restassured.matcher.RestAssuredMatchers.matchesXsd;
import static io.restassured.path.xml.XmlPath.from;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.core.IsCollectionContaining.hasItems;
import static org.hamcrest.xml.HasXPath.hasXPath;

public class XMLTest {

    /**
     * 需要比较多个属性时，直接使用body方法，不用那么麻烦多次发请求
     * 多种方式比较
     */
    @Test
    public void TestmakePostRequest(){
        RestAssured.registerParser("text/plain",Parser.XML);
        given().
                parameters("firstName", "John", "lastName", "Doe").
                when()
                .post("/greetXML")
                .then()
                .body("greeting.firstName", equalTo("John"))
                .body("greeting.lastName", equalTo("Doe"))
                .body("greeting.firstName", equalTo("John"), "greeting.lastName", equalTo("Doe"));

        System.out.println("POST 请求测试成功!");
    }

    /**
     * 配置xml的命名空间，方便返回值比较
     * 有冒号前缀，表示进入特定的标签
     * 没有冒号前缀，表示选择所有的指定标签
     * 代码中输入的值是期望值，而URL返回的是实际值
     */
    @Test
    public void TestvalidateNameSpaceGetRequest(){

        RestAssured.registerParser("text/plain",Parser.XML);
        given().
                config(RestAssured.config().xmlConfig(xmlConfig().declareNamespace("test", "http://localhost/"))).
                when().
                get("/namespace").
                then().
                body("foo.bar.text()", equalTo("sudo make me a sandwich!")).
                body(":foo.:bar.text()", equalTo("sudo ")).
                body("foo.test:bar.text()", equalTo("make me a sandwich!"));
        System.out.println("xml文件命名空间的验证成功！");

        //使用X-Path进行xml内容验证。关键是Match比较器,
        given().parameters("firstName", "John", "lastName", "Doe")
                .when()
                .post("/greetXML")
                .then()
                .body(hasXPath("/greeting/firstName", containsString("Jo")))
                .body(hasXPath("/greeting/lastName", containsString("Do")))
                .body(hasXPath("/greeting/firstName[text()='John']"));
        System.out.println("使用X-Path进行xml文件验证成功！");

        /**
         * 在Xpath表达式语法中使用命名空间,需要配置javax.xml.namespace.NamespaceContext的实例
         * XPath:xml 路径语言，确定xml文档中某部分位置的语言
         * 因为不熟悉xml和XPath语法，怎是不确定怎么写代码
         */
//        given().
//                config(RestAssured.config().xmlConfig(xmlConfig().with().namespaceAware(true))).
//                when().
//                get("/namespace").
//                then().
//                body(hasXPath("/...", new NamespaceContext() {
//                    @Override
//                    public String getNamespaceURI(String prefix) {
//                        return null;
//                    }
//
//                    @Override
//                    public String getPrefix(String namespaceURI) {
//                        return null;
//                    }
//
//                    @Override
//                    public Iterator getPrefixes(String namespaceURI) {
//                        return null;
//                    }
//                }));

        //xsd和dtd都是用来描述json/xml等具体数据的格式的文件，能够作为一种规范约束数据
//        get("/namespace").then().assertThat().body(matchesXsd("xsd...."));
//        get("/namespace").then().assertThat().body(matchesDtd("dtd...."));

    }

    @Test
    public void TestvalidateGroovyGetRequest(){

        RestAssured.registerParser("text/plain",Parser.XML);
        when().
                get("/groovy").
                then().
                body("shopping.category.find { it.@type == 'groceries' }.item", hasItems("Chocolate", "Coffee"));
        System.out.println("grrovy语法查询属性成功");

        String response = get("/groovy").asString();
        List<String> groceries = from(response).getList("shopping.category.find { it.@type == 'groceries' }.item");
        System.out.println("xmlPath获取数据："+groceries);

        //字符串连起来了
        Object object = get("/groovy").path("shopping.category.find { it.@type == 'groceries' }.item");
        System.out.println("快捷方式获取数据："+object);

        when().
                get("/groovy").
                then().
                body("**.find { it.@type == 'groceries' }", hasItems("Chocolate", "Coffee"));
        System.out.println("深度优先遍历验证数据成功！");

        System.out.println("验证groovy语法成功！");

    }


}
